/*
 * Copyright (c) 2007-2020 西安交通信息投资营运有限公司 版权所有
 */

package com.xci.edu.core.service;

import com.github.lvyanyang.annotation.OperateLog;
import com.github.lvyanyang.sys.core.BaseSysService;
import com.xci.edu.core.entity.EduValidateQuestion;
import com.xci.edu.core.dao.EduValidateQuestionDao;
import com.xci.edu.core.filter.EduValidateQuestionFilter;
import com.github.lvyanyang.core.BaseService;
import com.github.lvyanyang.core.BoolResult;
import com.github.lvyanyang.core.PageList;
import com.github.lvyanyang.core.Param;
import com.github.lvyanyang.core.XCI;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.Cache;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 验证问题服务
 * @author 吕艳阳 lvyanyang@xci96716.com
 * @since 2020-11-24 10:19:12
 */
@Service
public class EduValidateQuestionService extends BaseSysService {
    /** 验证问题数据层对象 */
    @Resource private EduValidateQuestionDao eduValidateQuestionDao;

    /**
     * 新建验证问题
     * @param entity 验证问题实体
     */
    @OperateLog(msg = "新建验证问题", module = "验证问题")
    @Transactional(rollbackFor = Exception.class)
    public BoolResult insert(EduValidateQuestion entity) {
        return save(entity, true);
    }

    /**
     * 修改验证问题
     * @param entity 验证问题实体
     */
    @OperateLog(msg = "修改验证问题", module = "验证问题")
    @Transactional(rollbackFor = Exception.class)
    public BoolResult update(EduValidateQuestion entity) {
        return save(entity, false);
    }

    /**
     * 删除验证问题
     * @param ids 验证问题主键字符串
     */
    @OperateLog(msg = "删除验证问题", module = "验证问题")
    @Transactional(rollbackFor = Exception.class)
    public BoolResult delete(@NotBlank(message = "请指定验证问题主键字符串") String ids) {
        XCI.forEachIds(ids, id -> {
            var entity = eduValidateQuestionDao.selectById(id);
            if (entity == null) return;

            eduValidateQuestionDao.deleteById(entity.getId());
            logService.saveDeleteHistoryLogAsync(entity.getId(), entity);
        });
        return BoolResult.success();
    }

    /**
    * 是否存在指定名称的验证问题
    * @param name      验证问题名称
    * @param excludeId 排除的主键，如果为null则不指定排除的主键
    * @return 如果存在返回true
    */
    public boolean existByName(@NotBlank(message = "请指定验证问题名称") String name, Long excludeId) {
       return eduValidateQuestionDao.existxByName(name, excludeId);
    }

    /**
     * 根据主键查询单个验证问题
     * @param id 验证问题主键
     * @return 返回验证问题实体
     */
    public EduValidateQuestion selectById(@NotNull(message = "请指定验证问题主键") Long id) {
        return eduValidateQuestionDao.selectById(id);
    }

    /**
     * 查询验证问题列表
     * @param filter 过滤条件
     * @return 返回验证问题列表
     */
    public List<EduValidateQuestion> selectList(EduValidateQuestionFilter filter) {
        return eduValidateQuestionDao.selectList(filter);
    }

    /**
     * 查询验证问题分页列表
     * @param filter 过滤条件
     * @return 返回验证问题分页列表
     */
    public PageList<EduValidateQuestion> selectPageList(EduValidateQuestionFilter filter) {
        return PageList.of(eduValidateQuestionDao.selectPageList(filter));
    }

    /**
     * 随机查询单个验证问题
     * @return 返回验证问题实体
     */
    public EduValidateQuestion randomValidate() {
        return eduValidateQuestionDao.randomValidate();
    }

    /**
     * 保存数据,在insert和update之前和之后的校验和处理
     * @param entity  验证问题实体
     * @param created 是否新建
     */
    private BoolResult save(EduValidateQuestion entity, boolean created) {
        //新建时如果主键未指定,自动设置主键
        XCI.ifTrueAction(XCI.invalidId(entity.getId(), created), () -> entity.setId(XCI.nextId()));

        //检查验证问题编码是否存在
        if (eduValidateQuestionDao.existxByName(entity.getName(), XCI.getExcludeId(entity.getId(), created))) {
           return BoolResult.fail(XCI.format("验证问题名称[{}]已经存在", entity.getName()));
        }

        //更新数据库
        if (created) {
            eduValidateQuestionDao.insert(entity);
            logService.saveInsertHistoryLogAsync(entity.getId(), entity);
        } else {
            var before = eduValidateQuestionDao.selectById(entity.getId());
            eduValidateQuestionDao.update(entity);
            logService.saveUpdateHistoryLogAsync(entity.getId(), before, entity);
        }
        return BoolResult.success();
    }
}
